//////////////////////////////////////////////////////////////////////////

#ifndef _PRIMESWING_H_
#define _PRIMESWING_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _PRIMESIEVE_H_
#include "primesieve.h"
#endif

//////////////////////////////////////////////////////////////////////////


/** Prime Swing algorithm
* 
*   @author Roman Pasechnik
*   @since    Dec 22, 2009
*   @updated  Jan 07, 2009
*/
class PrimeSwing
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Computes factorial of integer number */
    mpz_class Factorial( int _number );


//////////////////////////////////////////////////////////////////////////

protected:

//////////////////////////////////////////////////////////////////////////


    /** Calculates swing */
    mpz_class Swing( int _number, PrimeSieve& _sieve );


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Computes factorial of integer number recursively */
    virtual void RecFactorial( mpz_class& _result, int _number, PrimeSieve& _sieve );


    /** Gets multiplies for Swing function. */
    IntVec GetMultiplies( int _number, PrimeSieve& _sieve );


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
